/*******************************************************************************
 * Copyright (c) 2008 Sylvain Sicard.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v2.1
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Sylvain Sicard - initial API and implementation
 ******************************************************************************/
package fr.jade.fraclite.orb.common.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.jgroups.util.Util;

import fr.jade.fraclite.orb.common.api.Marshaller;


/**
 * 
 * @author Sylvain Sicard
 *
 */
public class BasicMarshaller implements Marshaller {
        static final byte NULL  = 0;
        static final byte BOOL  = 1;
        static final byte LONG  = 2;
        static final byte OBJ   = 3;
        
        @Override        
        public byte[] objectToByteBuffer(Object obj) throws Exception {
          ByteArrayOutputStream out=new ByteArrayOutputStream(24);
          ObjectOutputStream oos=new ObjectOutputStream(out);

          try {
              if(obj == null) {
                  oos.writeByte(NULL);
              }
              else if(obj instanceof Boolean) {
                  oos.writeByte(BOOL);
                  oos.writeBoolean(((Boolean)obj).booleanValue());
              }
              else if(obj instanceof Long) {
                  oos.writeByte(LONG);
                  oos.writeLong(((Long)obj).longValue());
              }
              else {
                  oos.writeByte(OBJ);
                  oos.writeObject(obj);
              }
              oos.flush();
              return out.toByteArray();
          }
          finally {
              Util.close(oos);
          }
      }

        @Override
      public Object objectFromByteBuffer(byte[] buf) throws Exception {
          ByteArrayInputStream inp=new ByteArrayInputStream(buf);
          ObjectInputStream in=new ObjectInputStream(inp);

          try {
              int type=in.readByte();
              switch(type) {
                  case NULL:
                      return null;
                  case BOOL:
                      return new Boolean(in.readBoolean());
                  case LONG:
                      return new Long(in.readLong());
                  case OBJ:
                      return in.readObject();
                  default:
                      throw new IllegalArgumentException("incorrect type " + type);
              }
          }
          finally {
              Util.close(in);
          }
      }
    }

